package com.EthanYankang;


import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*
 *  tomcat只关心servlet，部署tomcat其实就是寻找servlet，在当前有哪几个项目，项目里面有哪几个servlet。
 * 我tomcat到时候接受到一个请求，我这个请求访问的那个项目，然后你访问的是那个应用里面的那个servlet。
 * 这就是tomcat的请求核心原理！！！！
 */

public class Tomcat {
    public void start() {
        try {
            ExecutorService es = Executors.newFixedThreadPool(20);
            ServerSocket serverSocket = new ServerSocket(8080);
            while (true) {
                Socket socket = serverSocket.accept();
                es.execute(new SocketProcess(socket));
                //Thread.sleep(1000);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
            //} catch (InterruptedException e) {
            //    throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        Tomcat tomcat = new Tomcat();
        tomcat.deployApps();
        tomcat.start();
    }

    //解析文件下存放的所有可能的servlet。来执行。
    private void deployApps() {
        File webapps = new File(System.getProperty("user.dir"), "webapps");
        for (String appName : webapps.list()) {             //为什么这里说是null？明明有值的呀！！！
            System.out.println("appName = " + appName);
            deployApp(webapps,appName);
        }
    }

        //找到当前下面有哪些servlet(判断有没有继承httpServlet即可)
        //这⾥找到的是File对象，我们需要得到它对应的Class对象，这就需要进⾏类的加载，在加载类之前，我
        //们需要得到File对象对应的包格式，⽐如"com.zhouyu.ZhouyuServlet"。
        private void deployApp(File webapps, String appName) {
            // 先拿到classes⽬录
            File appDirectory = new File(webapps, appName );
            File classesDirectory = new File(appDirectory, "classes");
            // 拿到该⽬录下的所有class⽂件
            List<File> classes = getAllFilePath(classesDirectory);
            for (File clazz : classes) {
                String name = clazz.getPath();
                name = name.replace(classesDirectory.getPath() + "\\", "");
                name = name.replace(".class", "");
                name = name.replace("\\", ".");
                System.out.println(name);
            }
        }

    public List<File> getAllFilePath(File srcFile) {
        List<File> result = new ArrayList<>();
        File[] files = srcFile.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    result.addAll(getAllFilePath(file));
                } else {
                    result.add(file);
                }
            }
        }
        return result;
    }

    //这样我们就能拿到对应class⽂件的类全限定名，然后就可以利⽤类加载器去加载了，注意此时⽤
    //AppClassLoader去加载这个类是加载不到的，因为webapps⽬录并不在classpath中，在Tomcat中是通
    //过⾃定义类加载器来进⾏加载的。

}